
'''

递归的特点：
1. 调用自身函数：递归函数是指在函数内部调用自身的函数。这意味着函数会在执行过程中不断地调用自身，直到满足某个终止条件。
2. 终止条件：递归函数必须有一个终止条件，用于告诉函数何时停止递归。当满足终止条件时，递归函数将停止调用自身，开始返回结果。
3. 递归深度：递归函数的递归深度是指函数调用自身的次数。递归深度的限制是由系统或编程语言的实现决定的，以防止无限递归导致栈溢出。
4. 栈空间：递归函数在执行过程中会使用栈空间来保存函数的调用信息。每次函数调用都会在栈上创建一个新的栈帧，用于存储局部变量和函数调用信息。
5. 空间复杂度：递归函数的空间复杂度通常较高，因为它需要在栈上保存多个函数调用的信息。递归深度越深，所需的栈空间也越大。
6. 可读性：递归函数的代码通常较为简洁，但可读性可能较差。由于递归的特性，代码的逻辑可能难以理解和维护。
7. 性能：递归函数的性能可能不如循环迭代。递归函数需要多次函数调用和返回，涉及到函数调用和返回的开销，可能导致性能下降。


'''

# 递归函数
def sum(n):
    if n <= 1:
        return n # 终止条件，函数的出口
    else:
        return n + sum(n-1) # 递归调用

s = sum(10)
print(s)



'''
函数的返回值：
1. return 语句用于从函数中返回一个值。当函数执行到 return 语句时，函数会立即停止执行，并将指定的值返回给调用者。
2. return 语句可以返回任何类型的值，包括整数、浮点数、字符串、列表、元组、字典、集合、布尔值、函数对象等。
3. return 语句可以在函数的任意位置使用，包括在循环中、条件语句中、嵌套函数中等。
4. 如果函数没有显式地使用 return 语句，或者 return 语句后面没有指定返回值，函数会默认返回 None。
5. 函数可以返回多个值，通过使用元组、列表、字典等数据结构来封装多个值。
6. 函数可以返回函数对象，即函数本身作为返回值。这可以用于实现高阶函数、装饰器等功能。
7. 函数可以使用 yield 语句来实现生成器函数，通过 yield 语句可以逐步生成值，而不是一次性返回所有值。
'''






'''
nonlocal 关键字用于在嵌套函数中引用并修改外部（非全局）函数的局部变量。
当你在一个嵌套函数中想要修改外部函数的局部变量时，Python 默认会创建一个新的局部变量，而不是修改外部函数的变量。
使用 nonlocal 关键字可以告诉Python解释器，你想要使用的是外部函数的局部变量，而不是创建一个新的局部变量。
'''
# 闭包
def outer():
    x = 10
    def inner():
        nonlocal x  # 声明x是外部函数的局部变量
        x += 1
        print(x)
    return inner
outer()()    # 11


